package com.sky.com.sky.config;

import com.sky.interceptor.AdminLoginInterceptor;
import com.sky.interceptor.UserLoginInterceptor;
import com.sky.json.JacksonObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.List;

@Slf4j
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    @Autowired
    private AdminLoginInterceptor loginInterceptor;

    @Autowired
    UserLoginInterceptor userLoginInterceptor;

    /**
     * 注册自定义拦截器
     *
     * @param registry
     */
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
       log.info("开始注册登录拦截器....");
       registry.addInterceptor(loginInterceptor)
               .addPathPatterns("/admin/**")
               .excludePathPatterns(
                     "admin/employee/login",
                       "/admin/employee/login",
                       "/error" //后台有异常，springboot自己会发这个请求
               );

       //注册小程序登录拦截器
        registry.addInterceptor(userLoginInterceptor)
        .addPathPatterns("/user/**")
        .excludePathPatterns(
                "/user/user/login",
                "/user/shop/status"
        );

    }

   /**
    * 扩展Spring MVC框架的消息转化器
    * @param converters
    * **/
   public void extendMessageConverters(List<HttpMessageConverter<?>> converters){
       //创建一个消息转换器对象
       MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
       // 需要为消息转换器设置一个对象转换器，对象转换器可以将Java对象序列化为json数据
       converter.setObjectMapper(new JacksonObjectMapper());
       //将自己的消息转化器加入容器中
       converters.add(0,converter);
   }

   /**
    * 通过knife4j生成接口文档
    * @return
    * **/
   @Bean
   public Docket docket(){
       ApiInfo apiInfo = new ApiInfoBuilder()
               .title("苍穹外卖-管理后台")
               .version("2.0")
               .description("管理后台接口文档")
               .build();
       Docket docket = new Docket(DocumentationType.SWAGGER_2)
               .groupName("管理端接口")
               .apiInfo(apiInfo)
               .select()
               .apis(RequestHandlerSelectors.basePackage("com.sky.web.admin"))
               .paths(PathSelectors.any())
               .build();
        return docket;
   }

    /***
     * 通过kenife4j生成接口文档
     * @return
     * */
    @Bean
    public Docket docket2(){
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("苍穹外卖-小程序端")
                .version("1.0")
                .description("小程序端接口文档")
                .build();
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .groupName("小程序接口")
                .apiInfo(apiInfo)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.sky.web.app"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }


    /***
     * 设置京团资源映射
     * @param registry
     * */
    public void addResourceHandlers(ResourceHandlerRegistry registry){
        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF.resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

}
